package it.csi.finregio.finreges.presentation.form;

import it.csi.finregio.finreges.dto.Ente;
import it.csi.finregio.finreges.dto.EnteScheda;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.TreeMap;

public class EntiSchedaContainer implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = -5819719499282481618L;
	private Map containerByAssessorato = new TreeMap();// la
														// key=idAssessorato/idEnte
														// value=array di
														// settori o direzioni

	public static final String NON_STANDARD = "NON_STANDARD";
	public static final String STANDARD = "STANDARD";
	public static final String ALTRI_ENTI = "ALTRI_ENTI";
	
	public static final int TYPE_NON_STANDARD = 2;
	public static final int TYPE_STANDARD = 1;
	public static final int TYPE_ALTRI_ENTI = 3;
	
	

	public void add(Ente ente, EnteScheda es, String type) {
		Map aMap = (Map) containerByAssessorato.get(ente);
		if (aMap == null) {
			aMap = new HashMap();
		}
		Collection listaDirSett = (Collection) aMap.get(type);
		if (listaDirSett == null) {
			listaDirSett = new ArrayList();
		}
		if (!listaDirSett.contains(es)) {
			listaDirSett.add(es);
			aMap.put(type, listaDirSett);
		}
		containerByAssessorato.put(ente, aMap);
	}
	
	public void add(Ente ente, EnteScheda es, int type){
		switch(type){
		case TYPE_NON_STANDARD:
			add(ente, es, NON_STANDARD);
			break;
		case TYPE_STANDARD:
			add(ente, es, STANDARD);
			break;
		case TYPE_ALTRI_ENTI:
			add(ente, es, ALTRI_ENTI);
			break;
		}
	}

	public boolean contains(Ente ente) {
		return containerByAssessorato.containsKey(ente);
	}

	public Collection get(Ente ente, String type) {
		Map aMap = (Map) containerByAssessorato.get(ente);
		if (aMap == null) {
			return null;
		}
		Collection dirOsett = (Collection) aMap.get(type);

		return dirOsett;
	}

	public void remove(Ente ente) {
		containerByAssessorato.remove(ente);
	}

	public int size() {
		return containerByAssessorato.size();
	}

	public Iterator iterator() {
		return containerByAssessorato.keySet().iterator();
	}

	public Map getContainerByAssessorato() {
		return containerByAssessorato;
	}

}
